/*
    *@brief				    :如果对现已创建的某个线程的终止状态不感兴趣，可以使用pthread_detach()函数将其分离，那么该线程在退出时，操作系统会自动回收它所占用的资源。
                            创建线程时就确定要将该线程分离， 可以修改 pthread_attr_t 结构中的 detachstate 线程属性，让线程一开始运行就处于分离状态
    
    *@param[attr]		    :调用 pthread_create()创建线程时，参数 attr 设置为 NULL， 表示使用属性的默认值创建线程。 如果不使用默认值，参数 attr 必须要指向一个 pthread_attr_t 对象;
    *@param[detachstate]    :取值如下：
                            PTHREAD_CREATE_DETACHED： 新建线程一开始运行便处于分离状态， 以分离状态启动线程，
                            无法被其它线程调用 pthread_join()回收，线程结束后由操作系统收回其所占用的资源；
                            PTHREAD_CREATE_JOINABLE： 这是 detachstate 线程属性的默认值， 正常启动线程，可以被
                            其它线程获取终止状态信息。


    *return				    :成功返回 0，失败将返回一个非 0 值的错误码.
 */
// int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate);
// int pthread_attr_getdetachstate(const pthread_attr_t *attr, int *detachstate);

/*创建新的线程，将线程的栈大小设置为 4Kbyte。*/

#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <string.h>

static void *new_thread_start(void *arg)
{
    puts("新线程--start run");
    pthread_exit(NULL); 
}

int main(void)
{
    pthread_t tid;
    pthread_attr_t attr;

    void *tret;
    int ret;

    //线程属性函数初始化
    pthread_attr_init(&attr);

    //设置为分离状态，不可回收
    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);

    //申请一个线程
    ret = pthread_create(&tid, &attr, new_thread_start, NULL);
    if (ret)
    {
        fprintf(stderr, "pthread_create error:%s\n", strerror(ret));
        exit(-1);
    }

    //等待分离线程执行完
    sleep(1);

    /* 销毁 attr 对象 */
    pthread_attr_destroy(&attr);

    exit(0);
}